# 你想创建一个新的拥有一些额外功能的实例属性类型，比如类型检查。

# 如果你想创建一个全新的实例属性，可以通过一个描述器类的形式来定义它的功能.
# 一个描述器就是一个实现了三个核心的属性访问操作(get, set, delete) 的类，分别为 __get__()、
# __set__() 和 __delete__() 这三个特殊的方法。这些方法接受一个实例作为输入，之后相应的操作实例底层的字典。
# 为了使用一个描述器，需将这个描述器的实例作为类属性放到一个类的定义中。


class Integer:
    def __init__(self, name):
        self.name = name

    def __get__(self, instance, cls):
        if instance is None:
            return self;
        else:
            return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise TypeError('Excepted an int')
        instance.__dict__[self.name] = value

    def __delete__(self, instance):
        del instance.__dict__[self.name]


class Point:
    x = Integer('x')
    y = Integer('y')

    def __init__(self, x, y):
        self.x = x
        self.y = y


p = Point(2, 3)
print(p.x)
print(p.y)
p.y = 5
print(p.y)
try:
    p.y = 3.5
except TypeError as e:
    print(e)
